package com.gitee.swsk33.websockethandlerdemo.handler.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;

/**
 * 简单的文本消息处理
 */
@Slf4j
@Component
public class TextWebSocketHandler implements WebSocketHandler {

	/**
	 * 连接建立时执行的方法
	 *
	 * @param session WebSocket会话对象
	 */
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		log.info("连接已建立！");
		// 创建消息对象
		// TextMessage是WebSocketMessage的子类，表示一个文本WebSocket消息
		// 可以传入JSON字符串构建文本消息
		TextMessage message = new TextMessage("连接成功！");
		// 会话send方法把消息发给客户端
		session.sendMessage(message);
		// 打印会话的一些信息
		log.info("会话连接信息：");
		log.info("会话id：{}", session.getId());
		log.info("会话URI：{}", session.getUri());
		log.info("会话来源IP：{}", session.getRemoteAddress());
		log.info("会话文本消息接收大小限制：{} 字节", session.getTextMessageSizeLimit());
		log.info("会话二进制消息接收大小限制：{} 字节", session.getBinaryMessageSizeLimit());
	}

	/**
	 * 客户端发来消息时执行的方法
	 *
	 * @param session WebSocket会话对象
	 * @param message 客户端发来的消息对象
	 */
	@Override
	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
		log.info("接收到客户端消息！");
		// WebSocketMessage的getPayload方法可以获取消息内容
		log.info(message.getPayload().toString());
	}

	/**
	 * 出现错误时的执行方法
	 *
	 * @param session   WebSocket会话对象
	 * @param exception 出现错误的异常
	 */
	@Override
	public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
		log.error("出现错误！{}", exception.getMessage());
		// 调用会话的close方法可以主动断连
		session.close();
	}

	/**
	 * 断开连接时执行的方法
	 *
	 * @param session     WebSocket会话对象
	 * @param closeStatus 断开连接的状态码
	 */
	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {
		log.warn("与客户端断开连接！");
	}

	/**
	 * 是否支持部分消息
	 * 不用管保持默认即可
	 */
	@Override
	public boolean supportsPartialMessages() {
		return false;
	}

}